package com.csnf.dao;

import com.csnf.entity.Authors;
import com.csnf.entity.Books;
import com.csnf.util.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * 书籍数据访问对象 (DAO) 类，用于与数据库中的 books 表进行交互。
 */
public class BookDao {

    /**
     * 根据书籍名称查询书籍及其作者信息。
     *
     * @param bookName 书籍名称（支持模糊查询）
     * @return 包含匹配书籍及其作者信息的列表
     * @throws Exception 如果发生数据库操作异常
     */
    public List<Books> getBooksByName(String bookName) throws Exception {
        // 创建一个列表来存储所有匹配的书籍对象
        List<Books> booksList = new ArrayList<>();

        // 获取数据库连接
        Connection conn = JdbcUtil.getConnection();
        // 定义 SQL 查询语句，使用 LIKE 进行模糊查询
        String sql = "select * from books where book_name like concat('%',?,'%')";
        // 创建 PreparedStatement 对象并设置参数
        PreparedStatement ps = JdbcUtil.getPreparedStatement(conn, sql, bookName);
        // 执行查询并获取结果集
        ResultSet rs = ps.executeQuery();

        // 遍历结果集并将每一行数据映射到 Books 对象中
        while (rs.next()) {
            Books books = JdbcUtil.invokeObject(rs, Books.class);

            // 通过作者 ID 查询作者信息
            String sql1 = "select * from authors where author_id=?";
            PreparedStatement ps1 = JdbcUtil.getPreparedStatement(conn, sql1, books.getAuthor_id());
            ResultSet rs1 = ps1.executeQuery();

            // 将查询到的作者信息设置到书籍对象中
            if (rs1.next()) {
                Authors authors = JdbcUtil.invokeObject(rs1, Authors.class);
                books.setAuthors(authors);
            }

            // 关闭内层查询的资源
            JdbcUtil.close(rs1, ps1);

            // 将书籍对象添加到列表中
            booksList.add(books);
        }

        // 关闭外层查询的资源
        JdbcUtil.close(rs, ps, conn);
        return booksList;
    }

    /**
     * 根据作者 ID 查询该作者的所有书籍。
     *
     * @param authorId 作者的唯一标识符
     * @return 包含该作者所有书籍的列表
     * @throws Exception 如果发生数据库操作异常
     */
    public List<Books> getBooksByAuthor(Integer authorId) throws Exception {
        // 创建一个列表来存储所有匹配的书籍对象
        List<Books> booksList = new ArrayList<>();

        // 获取数据库连接
        Connection conn = JdbcUtil.getConnection();
        // 定义 SQL 查询语句
        String sql = "select * from books where author_id=?";
        // 创建 PreparedStatement 对象并设置参数
        PreparedStatement ps = JdbcUtil.getPreparedStatement(conn, sql, authorId);
        // 执行查询并获取结果集
        ResultSet rs = ps.executeQuery();

        // 遍历结果集并将每一行数据映射到 Books 对象中
        while (rs.next()) {
            Books books = JdbcUtil.invokeObject(rs, Books.class);
            booksList.add(books);
        }

        // 关闭数据库资源
        JdbcUtil.close(rs, ps, conn);
        return booksList;
    }
}
